package com.cds.drizzt.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.spec.KeySpec;
import java.util.Base64;

@Component
@Slf4j
public class Pbkdf2Encoder {

    // 前端 PBKDF2 参数（必须与前端完全一致）
    private static final String SALT = "fixed_salt_123"; // 前端使用的固定盐值
    private static final int ITERATIONS = 10000; // 迭代次数
    private static final int KEY_LENGTH = 256; // 密钥长度（bit）
    private static final String ALGORITHM = "PBKDF2WithHmacSHA256"; // 哈希算法（与前端匹配）

    /**
     * 模拟前端 PBKDF2 加密，返回一致结果
     */
    public static String encode(String rawPassword) {
        try {
            // 1. 将盐值转换为字节数组（使用与前端相同的编码，如 UTF-8）
            byte[] saltBytes = SALT.getBytes(StandardCharsets.UTF_8);

            // 2. 构建 PBKDF2 参数规范
            KeySpec spec = new PBEKeySpec(
                    rawPassword.toCharArray(), // 原始密码
                    saltBytes,                // 盐值字节数组
                    ITERATIONS,               // 迭代次数
                    KEY_LENGTH                // 密钥长度（bit）
            );

            // 3. 使用指定算法生成密钥
            SecretKeyFactory factory = SecretKeyFactory.getInstance(ALGORITHM);
            byte[] encodedKey = factory.generateSecret(spec).getEncoded();

            // 4. 按前端格式编码结果（如 Base64）
            return Base64.getEncoder().encodeToString(encodedKey);

        } catch (Exception e) {
            throw new RuntimeException("PBKDF2 加密失败", e);
        }
    }
}